import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main(List<String> args) {
  runApp(
    // 在这里调用ChangeNotifierProvider，就可以为整个app提供model
    ChangeNotifierProvider(
      // 创建model，并将该model提供给整个app
      create: (context) => Counter(),
      child: MyApp(),
    ),
  );
}

class Counter with ChangeNotifier {
  int value = 0;
  void increment() {
    value++;
    notifyListeners();
  }
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,

      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Flutter Demo Home Page')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('You Have pushed the button this many times:'),
            // Consumer在Widget树中找到其父类Provider，并获取父类Provider中的model（在当前示例中，对应的model是Counter）。然后，利用该model构建Widget，并在model更新时重建Widget
            Consumer<Counter>(
              builder: (context, counter, child) => Text(
                '${counter.value}',
                style: Theme.of(context).textTheme.headlineMedium,
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 在可以访问context的地方都可以访问到对应的Provider，其中一种访问方式是Provider.of<Counter>(context)。
          // 同时，在Provider包中也针对Context类定义了扩展方法。
          // 在任意Widget的build方法中都可以通过调用context.watch<Counter>()访问Counter的当前状态，并在Counter发生改变时要求Flutter重绘widget
          // 但在build方法之外不要调用context.watch()，因为这样操作容易报错。建议调用context.read<Counter>()，该方法同样获取model当前状态但不要求Flutter执行重绘操作。
          // 由于当前代码不在build方法中，而是在一个回调函数中，每次点击FloatingActionButton，该回调函数都会被调用，因此，在这里应该使用context.read()。
          context.read<Counter>().increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
